package com.example.propertymanagement.service;

import com.example.propertymanagement.dto.AdminDTO;
import com.example.propertymanagement.entity.AdminUser;
import com.example.propertymanagement.repository.AdminRepository;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * AdminService：管理员相关的业务逻辑处理
 */
@Service
public class AdminService {

    @Autowired
    private AdminRepository adminRepository;  // 注入 AdminRepository 用于数据库操作

    @Autowired
    private BCryptPasswordEncoder passwordEncoder;  // 注入密码加密工具

    @Autowired
    private ModelMapper modelMapper;  // 使用 ModelMapper 进行实体转换

    /**
     * 获取所有管理员
     * @return 管理员列表
     */
    public List<AdminDTO> getAllAdmins() {
        List<AdminUser> adminUsers = adminRepository.findAll();  // 获取所有管理员
        return adminUsers.stream()
                .map(this::convertToDTO)  // 转换每个 AdminUser 为 AdminDTO
                .collect(Collectors.toList());
    }

    /**
     * 根据管理员ID获取管理员
     * @param id 管理员ID
     * @return 管理员对象
     */
    public Optional<AdminDTO> getAdminById(Integer id) {
        Optional<AdminUser> adminUserOptional = adminRepository.findById(id);
        return adminUserOptional.map(this::convertToDTO);  // 转换 AdminUser 为 AdminDTO
    }

    /**
     * 根据管理员用户名获取管理员
     * @param username 管理员用户名
     * @return 管理员对象
     */
    public Optional<AdminDTO> getAdminByUsername(String username) {
        Optional<AdminUser> adminUserOptional = adminRepository.findByUsername(username);
        return adminUserOptional.map(this::convertToDTO);  // 转换 AdminUser 为 AdminDTO
    }

    /**
     * 创建管理员
     * @param adminUser 管理员对象
     * @return 创建后的管理员对象
     */
    public AdminUser createAdmin(AdminUser adminUser) {
        adminUser.setPassword(passwordEncoder.encode(adminUser.getPassword()));  // 加密管理员密码
        return adminRepository.save(adminUser);  // 保存管理员对象
    }

    /**
     * 更新管理员信息
     * @param adminUser 管理员对象
     * @return 更新后的管理员对象
     */
    public AdminUser updateAdmin(AdminUser adminUser) {
        return adminRepository.save(adminUser);  // 更新管理员信息
    }

    /**
     * 删除管理员
     * @param id 管理员ID
     */
    public void deleteAdmin(Integer id) {
        adminRepository.deleteById(id);  // 删除管理员
    }

    /**
     * 将 AdminUser 转换为 AdminDTO
     * @param adminUser 管理员实体
     * @return 管理员 DTO
     */
    private AdminDTO convertToDTO(AdminUser adminUser) {
        AdminDTO adminDTO = modelMapper.map(adminUser, AdminDTO.class);  // 使用 ModelMapper 转换
        // 如果管理员管理的小区集合不为空，提取小区 ID 列表
        List<Integer> communityIds = adminUser.getCommunities().stream()
                .map(community -> community.getId())
                .collect(Collectors.toList());
        adminDTO.setCommunityIds(communityIds);  // 设置小区ID列表
        return adminDTO;  // 返回转换后的 DTO
    }
}